/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Application.MainForm;

import Application.*;

import java.awt.*;
import java.awt.event.*;
/**
 * Fo Form osztaly
 * @author Stikmann
 */
public class MainForm extends Frame 
        implements WindowListener, ActionListener,NetworkUpdateListener{
    /**
     * A modell
     */
    Network net;
    public void windowActivated(WindowEvent e){}
    public void windowClosed(WindowEvent e) {}

    public void windowClosing(WindowEvent e){
        dispose();
    }
    public void windowDeactivated(WindowEvent e) {}
    public void windowDeiconified(WindowEvent e) {}
    public void windowIconified(WindowEvent e) {}
    public void windowOpened(WindowEvent e) {}

    /**
     * A legtobb event ide fut be, az ActionCommand-juk alapjan osztja szet a
     * kulonbozo fuggvenyekre.
     * @param e Java standard parameter
     */
    public void actionPerformed(ActionEvent e){
        String cmd=e.getActionCommand();
        try{
            if (cmd.equals("LOAD")){
                FileDialog fd=new FileDialog(this);
                fd.setVisible(true);
                if (fd.getFile()!=null){
                    NetworkFileParser nfp=new NetworkFileParser();
                    nfp.parse(fd.getDirectory()+ fd.getFile());
                    String error=nfp.net.check();
                    if(error!=null)
                        throw new Exception(error);
                    net=nfp.net;
                    halozatmenu.setEnabled(true);
                    if (view!=null)
                        viewcontainer.remove(view);
                    view=new NetworkControl(net,this);
                    viewcontainer.add(view);
                    validateTree();
                }
            }
            else if (cmd.equals("QUIT"))
                dispose();
            else if (cmd.equals("RESET"))
                net.reset();
            else if (cmd.equals("SIM")){
                net.simulate();
                for (CheckResetSimulate elem:net.collection)
                    if (elem instanceof Application.Elements.Osc)
                        ((Application.Elements.Osc)elem).step();
            }
            else if (cmd.equals("STEP")){
                for (CheckResetSimulate elem:net.collection)
                    if (elem instanceof Application.Elements.Wavegen)
                        ((Application.Elements.Wavegen)elem).step();
                networkUpdate();
            }
        }catch(Exception ex){
            new MessageBox(this,"Hiba","Hiba történt a művelet végrehajtása közben: "+ex.toString());
        }

        if(view!=null)
            view.invalidate();
    }

    /**
     * A NetworkUpdateListener eventje, ha egy masik control megvaltoztatja a
     * modellt, ennek meghivasaval ertesiti a Formot.
     */
    public void networkUpdate(){
        if (autosim.getState())
        try{
            net.simulate();
            for (CheckResetSimulate elem:net.collection)
                if (elem instanceof Application.Elements.Osc)
                    ((Application.Elements.Osc)elem).step();
            if(view!=null)
                view.invalidate();
        }catch(Exception ex){
            autosim.setState(false);
            new MessageBox(this,"Hiba","Hiba történt a művelet végrehajtása közben: "+ex.toString()+
                    " A további hibák megelőzésére az automatikus szimuláció ki lett kapcsolva.");
        }
    }

    /**
     * Fajl menu
     */
    Menu filemenu;

    /**
     * Halozat menu
     */
    Menu halozatmenu;

    /**
     * Automatikus szimulacio menuelem
     */
    CheckboxMenuItem autosim;

    /**
     * A halozat megjeleniteset es az egyes elemek vezerleset vegzo osztaly
     */
    NetworkControl view;

    /**
     * A view-t tartalmazo container, jelen esetben egy ScrollPane
     */
    Container viewcontainer;

    /**
     * A konstruktor. Lekrealja az osszes elemet es beallitja az event
     * listenereket.
     */
    @SuppressWarnings("LeakingThisInConstructor")
    public MainForm(){
        super("Digital Simulator Pro 2011 Ultima Prime GUI edition");
        setSize(640,480);
        setLocationRelativeTo(null);
        addWindowListener(this);

        MenuBar menubar=new MenuBar();

        filemenu=new Menu("Fájl");

        MenuItem fileload=new MenuItem("Betöltés");
        fileload.addActionListener(this);
        fileload.setActionCommand("LOAD");
        filemenu.add(fileload);

        MenuItem filequit=new MenuItem("Kilépés");
        filequit.addActionListener(this);
        filequit.setActionCommand("QUIT");
        filemenu.add(filequit);
        menubar.add(filemenu);

        halozatmenu=new Menu("Hálózat");
        halozatmenu.setEnabled(false);
        MenuItem halozatsim=new MenuItem("Szimuláció");
        halozatsim.addActionListener(this);
        halozatsim.setActionCommand("SIM");
        halozatmenu.add(halozatsim);

        MenuItem halozatreset=new MenuItem("Alaphelyzet");
        halozatreset.addActionListener(this);
        halozatreset.setActionCommand("RESET");
        halozatmenu.add(halozatreset);

        MenuItem halozatstep=new MenuItem("Léptetés");
        halozatstep.addActionListener(this);
        halozatstep.setActionCommand("STEP");
        halozatmenu.add(halozatstep);

        halozatmenu.addSeparator();

        autosim=new CheckboxMenuItem ("Automatikus szimuláció");
        autosim.setState(true);
        halozatmenu.add(autosim);
        menubar.add(halozatmenu);
       
        setMenuBar(menubar);

        viewcontainer=new ScrollPane();
        add(viewcontainer);
        
        setVisible(true);
    }
}
